#include "CircularQueue.hpp"
#include "Task.hpp"
#include <ctime>
#include <unistd.h>

std::string SelfName()
{
    char name[64];
    snprintf(name, sizeof name, "thread[0x%x]", pthread_self());
    return name;
}

void* producer(void* args)
{
    // Circular_Queue<int>* cq = static_cast<Circular_Queue<int>*>(args);
    Circular_Queue<CalTask>* cq = static_cast<Circular_Queue<CalTask>*>(args);

    while(true)
    {
        //单生产，单消费
        // 1.生成数据
        // int data = rand() % 10;
        // 2.生产任务
        // cq->push(data);
        // std::cout << SelfName() << ", 生产任务完成，生产的任务是：" << data << std::endl;
        
        int x = rand() % 10;
        int y = rand() % 5;
        char OperCode = oper[rand() % oper.size()];
        CalTask t(x, y, OperCode, Add);
        cq->push(t);
        std::cout << SelfName() << ", 生产任务完成，生产的任务是：" << t.getTask() << std::endl;
    }
}

void* consumer(void* args)
{
    //Circular_Queue<int>* cq = static_cast<Circular_Queue<int>*>(args);
    Circular_Queue<CalTask>* cq = static_cast<Circular_Queue<CalTask>*>(args);
    
    while(true)
    {
        sleep(3);

        // 消费任务
        // int result;
        // cq->pop(&result);
        // std::cout << SelfName() << ", 消费任务完成，消费的任务是：" << result << std::endl;
        // sleep(1);

        CalTask result;
        cq->pop(&result);
        std::cout << SelfName() << ", 消费任务完成，消费的任务是：" << result() << std::endl;
    }
}

// int main()
// {
//     srand((unsigned int)time(nullptr) % 12345);

//     Circular_Queue<int>* cq = new Circular_Queue<int>();
//     Circular_Queue<CalTask>* cq = new Circular_Queue<CalTask>();

//     pthread_t p,c;
//     pthread_create(&p, nullptr, producer, cq);
//     pthread_create(&c, nullptr, consumer, cq);


//     pthread_join(p, nullptr);
//     pthread_join(c, nullptr);
//     delete cq;
//     return 0;
// }

int main()
{
    srand((unsigned int)time(nullptr) % 12345);
    // new一份公共资源
    Circular_Queue<CalTask>* cq = new Circular_Queue<CalTask>();
    // 创建线程
    pthread_t p[4],c[8];
    for(int i = 0; i < 4; ++i)
    {
        pthread_create(&p[i], nullptr, producer, cq);
    }

    for(int i = 0; i < 8; ++i)
    {
        pthread_create(&c[i], nullptr, consumer, cq);
    }
    //线程等待
    for(int i = 0; i < 4; ++i)
    {
        pthread_join(p[i], nullptr);
    }
    for(int i = 0; i < 8; ++i)
    {
        pthread_join(c[i], nullptr);
    }
    // 释放new的资源
    delete cq;
    return 0;
}

